
"""
    tcp客户端 1.0
        1、scoker套接字
        2、bind ip和端口
        3、listen 使套接字变为可以被动连接
        4、accept等待客户端连接
        5、使用新的socket  recv/send 接受发送数据
        6、关闭新的套接字
        7、关闭服务端套接字
"""

import socket

tcp_server__so = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

tcp_server__so.bind(("127.0.0.1", 8080))

# listen() 作用设置tcp_so套接字为被动监听模式，不能再主动发送数据
# 128 表示最大连接数，只在windows中有用，在linux中无用
tcp_server__so.listen(128)

"""
    accept()开始接收客户端连接，程序会默认进入阻塞状态（等待客户端连接），如果客户端连接后，程序自动解除阻塞
        accept（）返回的数据包含两部分
            1、返回了一个新的socket对象
            2、客户端的ip和端口号（原则）
"""
tcp_client_so, client_ip_port = tcp_server__so.accept()
print("%s客户端已连接" % str(client_ip_port))

# recv会让程序再次阻塞，直到收到消息解除阻塞
recv_data = tcp_client_so.recv(1024)
tcp_client_so.send("hello, world!".encode())

recv_text = recv_data.decode("GBK")
print("接受到%s客户端发送的消息: %s" % (client_ip_port, str(recv_text)))

# 和当前客户端连接关闭
tcp_client_so.close()

tcp_server__so.close()

